//
//  NSObject+Property.m
//  justTest
//
//  Created by 小零钱 on 2018/3/1.
//  Copyright © 2018年 小零钱. All rights reserved.
//

/*
应用场景：给系统的类添加属性的时候,可以使用runtime动态添加属性方法。
注解：系统 NSObject 添加一个分类，我们知道在分类中是不能够添加成员属性的，虽然我们用了@property，但是仅仅会自动生成get和set方法的声明，并没有带下划线的属性和方法实现生成。但是我们可以通过runtime就可以做到给它方法的实现。
*/

#import "NSObject+Property.h"
#import <objc/message.h>

@implementation NSObject (Property)


#pragma mark - setter
- (void)setName:(NSString *)name {
    /*
     objc_setAssociatedObject 将某个值跟某个对象关联起来，将某个值存储到某个对象中
     参数： object 给哪个对象添加属性
           key 属性名称
           value 属性值
           policy 保存策略
     */
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (void)setHeight:(float)height {
    objc_setAssociatedObject(self, @"height", [NSString stringWithFormat:@"%f", height], OBJC_ASSOCIATION_ASSIGN);
}



#pragma mark - getter
- (NSString *)name {
    return objc_getAssociatedObject(self, @"name");
}

- (float)height {
    return [objc_getAssociatedObject(self, @"height") floatValue];
}


@end
